node.jsのいろいろなモジュール20 – node-shellで対話型アプリケーションを作成
対話型シェルアプリをつくろう
ユーザーからの入力を待って、入力されたコマンドを元に結果を返すプログラムを、対話型のプログラムといいます。 node自体もコマンドラインで「node」と入力すれば、対話型のシェル(REPL)が起動しますね。 今回は、nodeで簡単に対話型シェルアプリケーションを作成するモジュール、「node-shell」を紹介します。
環境構築方法
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.7.4
- Node.js : v0.8.15
- npm : 1.1.66
適当なディレクトリを作成し、そこでnpmを使用してnode-shellをインストールします。
% mkdir shell % cd shell % npm install shell % touch app.js
対話型シェルアプリケーションをつくってみる
ではnode-shellモジュールを使用して、簡単な対話型シェルをつくってみましょう。 今回は、配列型変数を操作する対話型シェルをつくります。 まずはプログラム全文です。
var shell = require('shell'); var app = new shell( { chdir: __dirname } ) //データ保存用変数 var stack = []; //シェルの環境設定 app.configure(function() { app.use(shell.history({ shell: app })); app.use(shell.completer({ shell: app })); app.use(shell.router({ shell: app })); app.use(shell.help({ shell: app, introduction: true })); }); //コマンド定義 app.cmd('push :value', 'add stack data', function(req, res, next){ stack.push(req.params.value); console.log("push:" + req.params.value); res.prompt(); }); app.cmd('pop', 'pop stack data', function(req, res, next){ var data = stack.pop(); console.log("pop:" + data ); res.prompt(); }); app.cmd('list', 'list stack data', function(req, res, next){ console.log("show stack list."); for(var i = 0; i < stack.length; i++) { console.log(stack[i]); } res.prompt(); }); [/javascript] </p> <p> では順番に解説します。</br> shellモジュールをrequireした後、引数のchdir(カレントディレクトリ)を指定してインスタンス化しています。</br> このapp変数に対して操作をすることで、対話型シェル全体の設定を変更することができます。</br> var shell = require('shell'); var app = new shell( { chdir: __dirname } )
次に、シェル全体の設定です。ヘルプ機能、履歴機能、補完機能を有効化しています。 詳細な説明はこのあたりをみてください。
//シェルの環境設定 app.configure(function() { app.use(shell.history({ shell: app })); app.use(shell.completer({ shell: app })); app.use(shell.router({ shell: app })); app.use(shell.help({ shell: app, introduction: true })); });
そして、シェルで使用するコマンドを登録します。 stack変数はシェルで操作する配列です。app.cmd関数を使用し、データを登録する「push」、 データを取り出す「pop」、stackの内容を表示する「list」コマンドを定義しています。
//データ保存用変数 var stack = [];
//コマンド定義 app.cmd('push :value', 'add stack data', function(req, res, next){ stack.push(req.params.value); console.log("push:" + req.params.value); res.prompt(); });
app.cmd('pop', 'pop stack data', function(req, res, next){ var data = stack.pop(); console.log("pop:" + data ); res.prompt(); });
app.cmd('list', 'list stack data', function(req, res, next){ console.log("show stack list."); for(var i = 0; i < stack.length; i++) { console.log(stack[i]); } res.prompt(); }); [/javascript]
プログラムの記述ができたら、起動して対話型シェルを動かしてみましょう。
% node app.js Type "help" or press enter for a list of commands >> help Available commands: quit Exit this shell help Show this message push :value add stack data pop pop stack data list list stack data
ヘルプを表示する「help」と、シェルを終了する「quit」はデフォルトで用意されています。 helpコマンドを入力すると、登録されているコマンド一覧が表示されていますね。
各コマンドを使ってみてください。データの登録、削除、表示ができます。 また、タブキーを押せば、補完もききます。
>> push hello push:hello >> list show stack list. hello >> pop pop:hello >> list show stack list.
まとめ
簡単に対話型シェルアプリケーションが作成できました。 履歴やヘルプ機能も提供してくれますし、いろいろな用途がありそうです。
参考サイトなど
- node-shell: http://www.adaltas.com/projects/node-shell/
- Github: https://github.com/wdavidw/node-shell